Background

Notes and format last updated Apr 9, 2020

Growth rates

Confirmed cases (total and new)

U.S.

agg.cases.US <- state.raw[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]

temp <- agg.cases.US
agg.cases.US[, total_cases_prev3 := temp$total_cases[match(agg.cases.US$date - 3, temp$date)]]
agg.cases.US[, total_cases_rtgrowth := total_cases/total_cases_prev3 - 1]
agg.cases.US[, new_cases_prev3 := total_cases - total_cases_prev3]

temp <- agg.cases.US
agg.cases.US[, new_cases_prev3_last := temp$new_cases_prev3[match(agg.cases.US$date - 1, temp$date)]]
agg.cases.US[, new_cases_rtgrowth := new_cases_prev3/new_cases_prev3_last - 1]

melt.use <- melt(agg.cases.US[, c("date", "total_cases_rtgrowth", "new_cases_rtgrowth")], id.vars = "date")
melt.use[, variable := ifelse(variable %in% "total_cases_rtgrowth", "Total Cases", "New Cases")]

agg.cases.growth.US.plot <- ggplot(melt.use[date >= "2020-03-16"], aes(x = date, y = value, color = variable)) + 
  geom_line(aes(group = variable)) +
    labs(x = "Date",
       y = "Rate of growth (rolling 3-day window)",
       title = "Rolling 3-day rate of growth: Confirmed COVID cases",
       subtitle = "United States",
       color = "Metric") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = 
                       c(ifelse(min(melt.use$value) > 0, 0, min(melt.use$value)), max(melt.use$value * 1.1)))
agg.cases.growth.US.plot

Our states

use.state <- "Washington"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]

temp <- agg.cases.state
agg.cases.state[, total_cases_prev3 := temp$total_cases[match(agg.cases.state$date - 3, temp$date)]]
agg.cases.state[, total_cases_rtgrowth := total_cases/total_cases_prev3 - 1]
agg.cases.state[, new_cases_prev3 := total_cases - total_cases_prev3]

temp <- agg.cases.state
agg.cases.state[, new_cases_prev3_last := temp$new_cases_prev3[match(agg.cases.state$date - 1, temp$date)]]
agg.cases.state[, new_cases_rtgrowth := new_cases_prev3/new_cases_prev3_last - 1]

melt.use <- melt(agg.cases.state[, c("date", "total_cases_rtgrowth", "new_cases_rtgrowth")], id.vars = "date")
melt.use[, variable := ifelse(variable %in% "total_cases_rtgrowth", "Total Cases", "New Cases")]

agg.cases.growth.state.plot <- ggplot(melt.use[date >= "2020-03-16"], aes(x = date, y = value, color = variable)) + 
  geom_line(aes(group = variable)) +
    labs(x = "Date",
       y = "Rate of growth (rolling 3-day window)",
       title = "Rolling 3-day rate of growth: Confirmed COVID cases",
       subtitle = use.state,
       color = "Metric") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = 
                       c(ifelse(min(melt.use$value) > 0, 0, min(melt.use$value)), max(melt.use$value * 1.1)))
agg.cases.growth.state.plot

use.state <- "California"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]

temp <- agg.cases.state
agg.cases.state[, total_cases_prev3 := temp$total_cases[match(agg.cases.state$date - 3, temp$date)]]
agg.cases.state[, total_cases_rtgrowth := total_cases/total_cases_prev3 - 1]
agg.cases.state[, new_cases_prev3 := total_cases - total_cases_prev3]

temp <- agg.cases.state
agg.cases.state[, new_cases_prev3_last := temp$new_cases_prev3[match(agg.cases.state$date - 1, temp$date)]]
agg.cases.state[, new_cases_rtgrowth := new_cases_prev3/new_cases_prev3_last - 1]

melt.use <- melt(agg.cases.state[, c("date", "total_cases_rtgrowth", "new_cases_rtgrowth")], id.vars = "date")
melt.use[, variable := ifelse(variable %in% "total_cases_rtgrowth", "Total Cases", "New Cases")]

agg.cases.growth.state.plot <- ggplot(melt.use[date >= "2020-03-16"], aes(x = date, y = value, color = variable)) + 
  geom_line(aes(group = variable)) +
    labs(x = "Date",
       y = "Rate of growth (rolling 3-day window)",
       title = "Rolling 3-day rate of growth: Confirmed COVID cases",
       subtitle = use.state,
       color = "Metric") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = 
                       c(ifelse(min(melt.use$value) > 0, 0, min(melt.use$value)), max(melt.use$value * 1.1)))
agg.cases.growth.state.plot

use.state <- "South Carolina"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]

temp <- agg.cases.state
agg.cases.state[, total_cases_prev3 := temp$total_cases[match(agg.cases.state$date - 3, temp$date)]]
agg.cases.state[, total_cases_rtgrowth := total_cases/total_cases_prev3 - 1]
agg.cases.state[, new_cases_prev3 := total_cases - total_cases_prev3]

temp <- agg.cases.state
agg.cases.state[, new_cases_prev3_last := temp$new_cases_prev3[match(agg.cases.state$date - 1, temp$date)]]
agg.cases.state[, new_cases_rtgrowth := new_cases_prev3/new_cases_prev3_last - 1]

melt.use <- melt(agg.cases.state[, c("date", "total_cases_rtgrowth", "new_cases_rtgrowth")], id.vars = "date")
melt.use[, variable := ifelse(variable %in% "total_cases_rtgrowth", "Total Cases", "New Cases")]

agg.cases.growth.state.plot <- ggplot(melt.use[date >= "2020-03-16"], aes(x = date, y = value, color = variable)) + 
  geom_line(aes(group = variable)) +
    labs(x = "Date",
       y = "Rate of growth (rolling 3-day window)",
       title = "Rolling 3-day rate of growth: Confirmed COVID cases",
       subtitle = use.state,
       color = "Metric") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = 
                       c(ifelse(min(melt.use$value) > 0, 0, min(melt.use$value)), max(melt.use$value * 1.1)))
agg.cases.growth.state.plot

use.state <- "Tennessee"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]

temp <- agg.cases.state
agg.cases.state[, total_cases_prev3 := temp$total_cases[match(agg.cases.state$date - 3, temp$date)]]
agg.cases.state[, total_cases_rtgrowth := total_cases/total_cases_prev3 - 1]
agg.cases.state[, new_cases_prev3 := total_cases - total_cases_prev3]

temp <- agg.cases.state
agg.cases.state[, new_cases_prev3_last := temp$new_cases_prev3[match(agg.cases.state$date - 1, temp$date)]]
agg.cases.state[, new_cases_rtgrowth := new_cases_prev3/new_cases_prev3_last - 1]

melt.use <- melt(agg.cases.state[, c("date", "total_cases_rtgrowth", "new_cases_rtgrowth")], id.vars = "date")
melt.use[, variable := ifelse(variable %in% "total_cases_rtgrowth", "Total Cases", "New Cases")]

agg.cases.growth.state.plot <- ggplot(melt.use[date >= "2020-03-16"], aes(x = date, y = value, color = variable)) + 
  geom_line(aes(group = variable)) +
    labs(x = "Date",
       y = "Rate of growth (rolling 3-day window)",
       title = "Rolling 3-day rate of growth: Confirmed COVID cases",
       subtitle = use.state,
       color = "Metric") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = 
                       c(ifelse(min(melt.use$value) > 0, 0, min(melt.use$value)), max(melt.use$value * 1.1)))
agg.cases.growth.state.plot

Deaths (total and new)

U.S.

agg.deaths.US <- state.raw[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]

temp <- agg.deaths.US
agg.deaths.US[, total_deaths_prev3 := temp$total_deaths[match(agg.deaths.US$date - 3, temp$date)]]
agg.deaths.US[, total_deaths_rtgrowth := total_deaths/total_deaths_prev3 - 1]
agg.deaths.US[, new_deaths_prev3 := total_deaths - total_deaths_prev3]

temp <- agg.deaths.US
agg.deaths.US[, new_deaths_prev3_last := temp$new_deaths_prev3[match(agg.deaths.US$date - 1, temp$date)]]
agg.deaths.US[, new_deaths_rtgrowth := new_deaths_prev3/new_deaths_prev3_last - 1]

melt.use <- melt(agg.deaths.US[, c("date", "total_deaths_rtgrowth", "new_deaths_rtgrowth")], id.vars = "date")
melt.use[, variable := ifelse(variable %in% "total_deaths_rtgrowth", "Total Deaths", "New Deaths")]

agg.deaths.growth.US.plot <- ggplot(melt.use[date >= "2020-03-16"], aes(x = date, y = value, color = variable)) + 
  geom_line(aes(group = variable)) +
    labs(x = "Date",
       y = "Rate of growth (rolling 3-day window)",
       title = "Rolling 3-day rate of growth: Confirmed COVID deaths",
       subtitle = "United States",
       color = "Metric") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = 
                       c(ifelse(min(melt.use$value) > 0, 0, min(melt.use$value)), max(melt.use$value * 1.1)))
agg.deaths.growth.US.plot

Our states

use.state <- "Washington"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- deaths.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]

temp <- agg.deaths.state
agg.deaths.state[, total_deaths_prev3 := temp$total_deaths[match(agg.deaths.state$date - 3, temp$date)]]
agg.deaths.state[, total_deaths_rtgrowth := total_deaths/total_deaths_prev3 - 1]
agg.deaths.state[, new_deaths_prev3 := total_deaths - total_deaths_prev3]

temp <- agg.deaths.state
agg.deaths.state[, new_deaths_prev3_last := temp$new_deaths_prev3[match(agg.deaths.state$date - 1, temp$date)]]
agg.deaths.state[, new_deaths_rtgrowth := new_deaths_prev3/new_deaths_prev3_last - 1]

melt.use <- melt(agg.deaths.state[, c("date", "total_deaths_rtgrowth", "new_deaths_rtgrowth")], id.vars = "date")
melt.use[, variable := ifelse(variable %in% "total_deaths_rtgrowth", "Total Deaths", "New Deaths")]

agg.deaths.growth.state.plot <- ggplot(melt.use[date >= "2020-03-16"], aes(x = date, y = value, color = variable)) + 
  geom_line(aes(group = variable)) +
    labs(x = "Date",
       y = "Rate of growth (rolling 3-day window)",
       title = "Rolling 3-day rate of growth: Confirmed COVID deaths",
       subtitle = use.state,
       color = "Metric") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = 
                       c(ifelse(min(melt.use$value) > 0, 0, min(melt.use$value)), max(melt.use$value * 1.1)))
agg.deaths.growth.state.plot

use.state <- "California"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- deaths.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]

temp <- agg.deaths.state
agg.deaths.state[, total_deaths_prev3 := temp$total_deaths[match(agg.deaths.state$date - 3, temp$date)]]
agg.deaths.state[, total_deaths_rtgrowth := total_deaths/total_deaths_prev3 - 1]
agg.deaths.state[, new_deaths_prev3 := total_deaths - total_deaths_prev3]

temp <- agg.deaths.state
agg.deaths.state[, new_deaths_prev3_last := temp$new_deaths_prev3[match(agg.deaths.state$date - 1, temp$date)]]
agg.deaths.state[, new_deaths_rtgrowth := new_deaths_prev3/new_deaths_prev3_last - 1]

melt.use <- melt(agg.deaths.state[, c("date", "total_deaths_rtgrowth", "new_deaths_rtgrowth")], id.vars = "date")
melt.use[, variable := ifelse(variable %in% "total_deaths_rtgrowth", "Total Deaths", "New Deaths")]

agg.deaths.growth.state.plot <- ggplot(melt.use[date >= "2020-03-16"], aes(x = date, y = value, color = variable)) + 
  geom_line(aes(group = variable)) +
    labs(x = "Date",
       y = "Rate of growth (rolling 3-day window)",
       title = "Rolling 3-day rate of growth: Confirmed COVID deaths",
       subtitle = use.state,
       color = "Metric") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = 
                       c(ifelse(min(melt.use$value) > 0, 0, min(melt.use$value)), max(melt.use$value * 1.1)))
agg.deaths.growth.state.plot

use.state <- "South Carolina"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- deaths.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]

temp <- agg.deaths.state
agg.deaths.state[, total_deaths_prev3 := temp$total_deaths[match(agg.deaths.state$date - 3, temp$date)]]
agg.deaths.state[, total_deaths_rtgrowth := total_deaths/total_deaths_prev3 - 1]
agg.deaths.state[, new_deaths_prev3 := total_deaths - total_deaths_prev3]

temp <- agg.deaths.state
agg.deaths.state[, new_deaths_prev3_last := temp$new_deaths_prev3[match(agg.deaths.state$date - 1, temp$date)]]
agg.deaths.state[, new_deaths_rtgrowth := new_deaths_prev3/new_deaths_prev3_last - 1]
melt.use <- melt(agg.deaths.state[, c("date", "total_deaths_rtgrowth", "new_deaths_rtgrowth")], id.vars = "date")
melt.use[, variable := ifelse(variable %in% "total_deaths_rtgrowth", "Total Deaths", "New Deaths")]

agg.deaths.growth.state.plot <- ggplot(melt.use[date >= "2020-03-16"], aes(x = date, y = value, color = variable)) + 
  geom_line(aes(group = variable)) +
    labs(x = "Date",
       y = "Rate of growth (rolling 3-day window)",
       title = "Rolling 3-day rate of growth: Confirmed COVID deaths",
       subtitle = use.state,
       color = "Metric") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = 
                       c(ifelse(min(melt.use$value) > 0, 0, min(melt.use$value)), max(melt.use$value * 1.1)))
agg.deaths.growth.state.plot

use.state <- "Tennessee"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- deaths.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]

temp <- agg.deaths.state
agg.deaths.state[, total_deaths_prev3 := temp$total_deaths[match(agg.deaths.state$date - 3, temp$date)]]
agg.deaths.state[, total_deaths_rtgrowth := total_deaths/total_deaths_prev3 - 1]
agg.deaths.state[, new_deaths_prev3 := total_deaths - total_deaths_prev3]

temp <- agg.deaths.state
agg.deaths.state[, new_deaths_prev3_last := temp$new_deaths_prev3[match(agg.deaths.state$date - 1, temp$date)]]
agg.deaths.state[, new_deaths_rtgrowth := new_deaths_prev3/new_deaths_prev3_last - 1]

melt.use <- melt(agg.deaths.state[, c("date", "total_deaths_rtgrowth", "new_deaths_rtgrowth")], id.vars = "date")
melt.use[, variable := ifelse(variable %in% "total_deaths_rtgrowth", "Total Deaths", "New Deaths")]

agg.deaths.growth.state.plot <- ggplot(melt.use[date >= "2020-03-16"], aes(x = date, y = value, color = variable)) + 
  geom_line(aes(group = variable)) +
    labs(x = "Date",
       y = "Rate of growth (rolling 3-day window)",
       title = "Rolling 3-day rate of growth: Confirmed COVID deaths",
       subtitle = use.state,
       color = "Metric") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = scales::percent_format(accuracy = 1), limits = 
                       c(ifelse(min(melt.use$value) > 0, 0, min(melt.use$value)), max(melt.use$value * 1.1)))
agg.deaths.growth.state.plot

By population rankings

States

Total confirmed cases

Table of total confirmed cases per million residents (all 50 states)

state.per.cap <- merge(state.raw, stay_dates, by = "state", all.x = T)
state.per.cap[, casesPerMillion := as.integer(cases/population * 1000000)]
date.cut <- max(state.per.cap$date)
state.per.cap.agg <- state.per.cap[date == date.cut]
state.per.cap.agg <- state.per.cap.agg[order(-casesPerMillion), c("state", "casesPerMillion")]
state.per.cap.agg[, casesPerMillion := comma(casesPerMillion)]
state.per.cap.agg
##                        state casesPerMillion
##  1:                 New York           8,221
##  2:               New Jersey           5,744
##  3:                Louisiana           3,932
##  4:            Massachusetts           2,748
##  5:              Connecticut           2,744
##  6:     District of Columbia           2,157
##  7:                 Michigan           2,140
##  8:             Rhode Island           1,630
##  9:             Pennsylvania           1,435
## 10:                 Illinois           1,295
## 11:               Washington           1,261
## 12:                 Delaware           1,241
## 13:                 Colorado           1,076
## 14:                  Georgia           1,025
## 15:                 Maryland           1,023
## 16:                  Vermont           1,006
## 17:                  Indiana             943
## 18:                   Nevada             797
## 19:                  Florida             783
## 20:              Mississippi             759
## 21:                    Idaho             757
## 22:                Tennessee             652
## 23:                     Utah             617
## 24:            New Hampshire             602
## 25:                  Alabama             578
## 26:                 Missouri             576
## 27:           South Carolina             542
## 28:               California             511
## 29:             South Dakota             505
## 30:                Wisconsin             495
## 31:                 Virginia             473
## 32:               New Mexico             471
## 33:                     Ohio             471
## 34:                 Oklahoma             425
## 35:                    Maine             416
## 36:                  Arizona             414
## 37:                  Wyoming             412
## 38:                     Iowa             402
## 39:                    Texas             392
## 40:                   Kansas             383
## 41:                 Arkansas             379
## 42:             North Dakota             352
## 43:           North Carolina             348
## 44:                 Kentucky             341
## 45:                  Montana             331
## 46:                   Alaska             318
## 47:                   Oregon             313
## 48:                   Hawaii             310
## 49:                 Nebraska             307
## 50:            West Virginia             292
## 51:                Minnesota             220
## 52:              Puerto Rico             213
## 53:           American Samoa            <NA>
## 54:                     Guam            <NA>
## 55: Northern Mariana Islands            <NA>
## 56:           Virgin Islands            <NA>
##                        state casesPerMillion
state.per.cap.agg[, row := .I]
top.ten <- state.per.cap.agg[row < 11, "state"]
state.per.cap.series <- state.per.cap[state %in% top.ten$state]
state.per.cap.plot <- ggplot(state.per.cap.series[date >= "2020-03-01"], aes(x = date, y = casesPerMillion, colour = state)) +
  geom_line(aes(group = state)) +
    labs(x = "Date",
       y = "Total confirmed COVID cases per million residents",
       title = "Total confirmed COVID cases per million residents",
       subtitle = paste0("States with 10 highest counts as of ", format(date.cut, "%B %d, %Y"))) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
state.per.cap.plot

New confirmed cases

Table of new cases per million residents: rolling 3-day total (all 50 states)

state.per.cap <- merge(state.raw, stay_dates, by = "state", all.x = T)
date.cut <- max(state.per.cap$date)
date.min <- max(state.per.cap$date) - 3
state.per.cap.agg <- state.per.cap[date == date.cut]
temp <- state.per.cap[date == date.min]
state.per.cap.agg[, casesPrev3 := temp$cases[match(state.per.cap.agg$state, temp$state)]]
state.per.cap.agg[, newCasesPrev3 := (cases - casesPrev3)]
state.per.cap.agg[, casesNewPerMillion := as.integer(newCasesPrev3/population * 1000000)]
state.per.cap.agg <- state.per.cap.agg[order(-casesNewPerMillion), c("state", "casesNewPerMillion")]
state.per.cap.agg[, casesNewPerMillion := comma(casesNewPerMillion)]
state.per.cap.agg
##                        state casesNewPerMillion
##  1:                 New York              1,502
##  2:               New Jersey              1,118
##  3:              Connecticut                807
##  4:            Massachusetts                740
##  5:                Louisiana                734
##  6:             Rhode Island                608
##  7:     District of Columbia                603
##  8:                 Delaware                437
##  9:                 Michigan                425
## 10:             Pennsylvania                414
## 11:                 Maryland                353
## 12:                 Illinois                328
## 13:                  Georgia                313
## 14:                  Indiana                207
## 15:             South Dakota                179
## 16:                 Colorado                178
## 17:              Mississippi                175
## 18:                  Alabama                169
## 19:               Washington                160
## 20:                   Nevada                157
## 21:                  Florida                148
## 22:               New Mexico                144
## 23:                  Vermont                136
## 24:                 Virginia                136
## 25:                 Missouri                133
## 26:                    Texas                112
## 27:           South Carolina                108
## 28:                 Kentucky                104
## 29:                    Idaho                102
## 30:                     Iowa                102
## 31:                Tennessee                102
## 32:            West Virginia                 99
## 33:               California                 98
## 34:                     Utah                 95
## 35:                   Kansas                 90
## 36:                     Ohio                 90
## 37:                 Oklahoma                 90
## 38:                 Nebraska                 80
## 39:            New Hampshire                 76
## 40:                Wisconsin                 76
## 41:                  Arizona                 75
## 42:           North Carolina                 74
## 43:                 Arkansas                 72
## 44:                   Alaska                 60
## 45:             North Dakota                 57
## 46:              Puerto Rico                 53
## 47:                  Wyoming                 46
## 48:                    Maine                 45
## 49:                Minnesota                 45
## 50:                   Oregon                 44
## 51:                   Hawaii                 38
## 52:                  Montana                 32
## 53:           American Samoa               <NA>
## 54:                     Guam               <NA>
## 55: Northern Mariana Islands               <NA>
## 56:           Virgin Islands               <NA>
##                        state casesNewPerMillion

Total deaths

Table of total deaths per million residents (all 50 states)

state.per.cap <- merge(state.raw, stay_dates, by = "state", all.x = T)
state.per.cap[, deathsPerMillion := as.integer(deaths/population * 1000000)]
date.cut <- max(state.per.cap$date)
state.per.cap.agg <- state.per.cap[date == date.cut]
state.per.cap.agg <- state.per.cap.agg[order(-deathsPerMillion), c("state", "deathsPerMillion")]
state.per.cap.agg[, deathsPerMillion := comma(deathsPerMillion)]
state.per.cap.agg
##                        state deathsPerMillion
##  1:                 New York              363
##  2:               New Jersey              191
##  3:                Louisiana              151
##  4:                 Michigan              107
##  5:              Connecticut              106
##  6:            Massachusetts               72
##  7:               Washington               62
##  8:     District of Columbia               45
##  9:                 Illinois               42
## 10:             Rhode Island               40
## 11:                 Colorado               39
## 12:                  Georgia               38
## 13:                  Indiana               36
## 14:                  Vermont               36
## 15:                   Nevada               26
## 16:             Pennsylvania               26
## 17:              Mississippi               25
## 18:                 Delaware               23
## 19:                 Maryland               22
## 20:                 Oklahoma               20
## 21:                Wisconsin               19
## 22:                 Kentucky               18
## 23:                     Ohio               18
## 24:                  Florida               17
## 25:                  Alabama               15
## 26:                 Missouri               15
## 27:            New Hampshire               15
## 28:                   Kansas               14
## 29:               California               13
## 30:                    Idaho               13
## 31:           South Carolina               13
## 32:                Tennessee               13
## 33:                  Arizona               12
## 34:                 Virginia               12
## 35:                    Maine               11
## 36:                   Oregon               10
## 37:              Puerto Rico               10
## 38:                     Iowa                8
## 39:                Minnesota                8
## 40:               New Mexico                8
## 41:                 Nebraska                7
## 42:           North Carolina                7
## 43:             South Dakota                7
## 44:                    Texas                7
## 45:                   Alaska                6
## 46:                 Arkansas                6
## 47:             North Dakota                6
## 48:                  Montana                5
## 49:                   Hawaii                4
## 50:                     Utah                4
## 51:            West Virginia                2
## 52:                  Wyoming                0
## 53:           American Samoa             <NA>
## 54:                     Guam             <NA>
## 55: Northern Mariana Islands             <NA>
## 56:           Virgin Islands             <NA>
##                        state deathsPerMillion
state.per.cap.agg[, row := .I]
top.ten <- state.per.cap.agg[row < 11, "state"]
state.per.cap.series <- state.per.cap[state %in% top.ten$state]
state.per.cap.plot <- ggplot(state.per.cap.series[date >= "2020-03-01"], aes(x = date, y = deathsPerMillion, colour = state)) +
  geom_line(aes(group = state)) +
    labs(x = "Date",
       y = "Total COVID-related deaths per million residents",
       title = "Total COVID-related deaths per million residents",
       subtitle = paste0("States with 10 highest counts as of ", format(date.cut, "%B %d, %Y"))) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
state.per.cap.plot

New deaths

Table of new deaths per million residents: rolling 3-day total (all 50 states)

state.per.cap <- merge(state.raw, stay_dates, by = "state", all.x = T)
date.cut <- max(state.per.cap$date)
date.min <- max(state.per.cap$date) - 3
state.per.cap.agg <- state.per.cap[date == date.cut]
temp <- state.per.cap[date == date.min]
state.per.cap.agg[, deathsPrev3 := temp$deaths[match(state.per.cap.agg$state, temp$state)]]
state.per.cap.agg[, newDeathsPrev3 := (deaths - deathsPrev3)]
state.per.cap.agg[, deathsNewPerMillion := as.integer(newDeathsPrev3/population * 1000000)]
state.per.cap.agg <- state.per.cap.agg[order(-deathsNewPerMillion), c("state", "deathsNewPerMillion")]
state.per.cap.agg[, deathsNewPerMillion := comma(deathsNewPerMillion)]
state.per.cap.agg
##                        state deathsNewPerMillion
##  1:                 New York                 118
##  2:               New Jersey                  78
##  3:              Connecticut                  48
##  4:                Louisiana                  40
##  5:            Massachusetts                  35
##  6:                 Michigan                  34
##  7:                 Illinois                  17
##  8:                  Indiana                  15
##  9:             Rhode Island                  15
## 10:                 Colorado                  13
## 11:             Pennsylvania                  13
## 12:               Washington                  12
## 13:     District of Columbia                  11
## 14:                  Georgia                  11
## 15:                 Delaware                   8
## 16:              Mississippi                   8
## 17:            New Hampshire                   8
## 18:                 Kentucky                   7
## 19:                 Maryland                   7
## 20:                   Nevada                   7
## 21:                 Oklahoma                   7
## 22:                    Idaho                   6
## 23:                 Missouri                   6
## 24:                     Ohio                   6
## 25:                 Virginia                   6
## 26:                  Alabama                   5
## 27:                  Florida                   5
## 28:                   Kansas                   5
## 29:                Wisconsin                   5
## 30:               California                   4
## 31:                    Maine                   4
## 32:                Tennessee                   4
## 33:                  Arizona                   3
## 34:                Minnesota                   3
## 35:           North Carolina                   3
## 36:                   Oregon                   3
## 37:              Puerto Rico                   3
## 38:           South Carolina                   3
## 39:             South Dakota                   3
## 40:                 Nebraska                   2
## 41:               New Mexico                   2
## 42:             North Dakota                   2
## 43:                    Texas                   2
## 44:                   Alaska                   1
## 45:                 Arkansas                   1
## 46:                   Hawaii                   0
## 47:                     Iowa                   0
## 48:                  Montana                   0
## 49:                     Utah                   0
## 50:                  Vermont                   0
## 51:            West Virginia                   0
## 52:                  Wyoming                   0
## 53:           American Samoa                <NA>
## 54:                     Guam                <NA>
## 55: Northern Mariana Islands                <NA>
## 56:           Virgin Islands                <NA>
##                        state deathsNewPerMillion
state.per.cap.agg[, row := .I]
top.ten <- state.per.cap.agg[row < 11, "state"]
state.per.cap.series <- state.per.cap[state %in% top.ten$state]
temp <- state.per.cap.series[, c("state", "date", "deaths")]
setnames(temp, "deaths", "deathsPrev3")
state.per.cap.series[, datePrev3 := date - 3]
state.per.cap.series <- merge(state.per.cap.series, temp, all.x = T, by.x = c("state", "datePrev3"), by.y = c("state", "date"))
state.per.cap.series[, newDeathsPrev3 := (deaths - deathsPrev3)]
state.per.cap.series[, deathsNewPerMillion := as.integer(newDeathsPrev3/population * 1000000)]
state.per.cap.plot <- ggplot(state.per.cap.series[date >= "2020-03-10"], aes(x = date, y = deathsNewPerMillion, colour = state)) +
  geom_line(aes(group = state)) +
    labs(x = "Date",
       y = "New COVID-related deaths per million residents",
       title = "New COVID-related deaths per million resident (3-day rolling total)",
       subtitle = paste0("States with 10 highest counts as of ", format(date.cut, "%B %d, %Y"))) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
state.per.cap.plot

Counties

Confirmed cases

Table showing total cases per million and percentile for all US counties Includes our counties and the top 5 in the US for perspective

##          county          state casesPerMillion rawRanking percentile
##  1:    Rockland       New York          20,458          1         99
##  2:      Blaine          Idaho          19,374          2         99
##  3: Westchester       New York          17,575          3         99
##  4:      Nassau       New York          14,842          4         99
##  5:    Randolph        Georgia          14,016          5         99
##  6:    Davidson      Tennessee           1,642        126         95
##  7:    Richland South Carolina           1,003        296         90
##  8:      Pierce     Washington             933        336         89
##  9:        York South Carolina             427        887         71
## 10:      Orange     California             340       1113         64

Our county percentiles over time

Deaths

Table showing total deaths per million and percentile for all US counties Includes our counties and the top 5 in the US for perspective

##        county          state deathsPerMillion rawRanking percentile
##  1:   Terrell        Georgia            1,172          1         99
##  2: Dougherty        Georgia              750          2         99
##  3:     Greer       Oklahoma              700          3         99
##  4:     Baker        Georgia              658          4         99
##  5:     Toole        Montana              633          5         99
##  6:  Richland South Carolina               24        479         84
##  7:    Pierce     Washington               19        565         82
##  8:  Davidson      Tennessee               19        566         81
##  9:      York South Carolina                7        800         74
## 10:    Orange     California                5        846         73

Our county percentiles over time

Raw counts

Total confirmed cases

U.S.

agg.cases.US <- state.raw[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
agg.cases.US.plot <- ggplot(agg.cases.US[date >= "2020-03-01"], aes(x = date, y = total_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total confirmed COVID cases",
       title = "Total confirmed COVID cases",
       subtitle = "United States") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.cases.US.plot

Our states

# adjust state name to flow through rest of code (use capitalized full state name)
use.state <- "Washington"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
agg.cases.state.plot <- ggplot(agg.cases.state[date >= "2020-03-01"], aes(x = date, y = total_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total confirmed COVID cases",
       title = "Total confirmed COVID cases",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.cases.state.plot

# adjust state name to flow through rest of code (use capitalized full state name)
use.state <- "California"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
agg.cases.state.plot <- ggplot(agg.cases.state[date >= "2020-03-01"], aes(x = date, y = total_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total confirmed COVID cases",
       title = "Total confirmed COVID cases",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.cases.state.plot

# adjust state name to flow through rest of code (use capitalized full state name)
use.state <- "South Carolina"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
agg.cases.state.plot <- ggplot(agg.cases.state[date >= "2020-03-01"], aes(x = date, y = total_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total confirmed COVID cases",
       title = "Total confirmed COVID cases",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.cases.state.plot

# adjust state name to flow through rest of code (use capitalized full state name)
use.state <- "Tennessee"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
agg.cases.state.plot <- ggplot(agg.cases.state[date >= "2020-03-01"], aes(x = date, y = total_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total confirmed COVID cases",
       title = "Total confirmed COVID cases",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.cases.state.plot

Our counties

# adjust state and county name to flow through rest of code (use capitalized full state name)
use.state <- "Washington"
use.county <- "Pierce"
cases.county <- county.raw[state %in% use.state & county %in% use.county]
agg.cases.county <- cases.county[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
agg.cases.county.plot <- ggplot(agg.cases.county[date >= "2020-03-01"], aes(x = date, y = total_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total confirmed COVID cases",
       title = "Total confirmed COVID cases",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.cases.county.plot

# adjust state and county name to flow through rest of code (use capitalized full state name)
use.state <- "California"
use.county <- "Orange"
cases.county <- county.raw[state %in% use.state & county %in% use.county]
agg.cases.county <- cases.county[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
agg.cases.county.plot <- ggplot(agg.cases.county[date >= "2020-03-01"], aes(x = date, y = total_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total confirmed COVID cases",
       title = "Total confirmed COVID cases",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.cases.county.plot

# adjust state and county name to flow through rest of code (use capitalized full state name)
use.state <- "South Carolina"
use.county <- "Richland"
cases.county <- county.raw[state %in% use.state & county %in% use.county]
agg.cases.county <- cases.county[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
agg.cases.county.plot <- ggplot(agg.cases.county[date >= "2020-03-01"], aes(x = date, y = total_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total confirmed COVID cases",
       title = "Total confirmed COVID cases",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.cases.county.plot

# adjust state and county name to flow through rest of code (use capitalized full state name)
use.state <- "South Carolina"
use.county <- "York"
cases.county <- county.raw[state %in% use.state & county %in% use.county]
agg.cases.county <- cases.county[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
agg.cases.county.plot <- ggplot(agg.cases.county[date >= "2020-03-01"], aes(x = date, y = total_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total confirmed COVID cases",
       title = "Total confirmed COVID cases",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.cases.county.plot

# adjust state and county name to flow through rest of code (use capitalized full state name)
use.state <- "Tennessee"
use.county <- "Davidson"
cases.county <- county.raw[state %in% use.state & county %in% use.county]
agg.cases.county <- cases.county[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
agg.cases.county.plot <- ggplot(agg.cases.county[date >= "2020-03-01"], aes(x = date, y = total_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total confirmed COVID cases",
       title = "Total confirmed COVID cases",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.cases.county.plot

New confirmed cases

U.S.

agg.cases.US <- state.raw[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
temp <- agg.cases.US
agg.cases.US[, total_cases_prev := temp$total_cases[match(agg.cases.US$date - 1, temp$date)]]
agg.cases.US[, total_new_cases := total_cases - total_cases_prev]
agg.new.cases.US.plot <- ggplot(agg.cases.US[date >= "2020-03-01"], aes(x = date, y = total_new_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Confirmed new COVID cases",
       title = "Confirmed new COVID cases by day",
       subtitle = "United States") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.new.cases.US.plot

Our states

use.state <- "Washington"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
temp <- agg.cases.state
agg.cases.state[, total_cases_prev := temp$total_cases[match(agg.cases.state$date - 1, temp$date)]]
agg.cases.state[, total_new_cases := total_cases - total_cases_prev]
agg.new.cases.state.plot <- ggplot(agg.cases.state[date >= "2020-03-01"], aes(x = date, y = total_new_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Confirmed new COVID cases",
       title = "Confirmed new COVID cases by day",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.new.cases.state.plot

use.state <- "California"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
temp <- agg.cases.state
agg.cases.state[, total_cases_prev := temp$total_cases[match(agg.cases.state$date - 1, temp$date)]]
agg.cases.state[, total_new_cases := total_cases - total_cases_prev]
agg.new.cases.state.plot <- ggplot(agg.cases.state[date >= "2020-03-01"], aes(x = date, y = total_new_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Confirmed new COVID cases",
       title = "Confirmed new COVID cases by day",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.new.cases.state.plot

use.state <- "South Carolina"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
temp <- agg.cases.state
agg.cases.state[, total_cases_prev := temp$total_cases[match(agg.cases.state$date - 1, temp$date)]]
agg.cases.state[, total_new_cases := total_cases - total_cases_prev]
agg.new.cases.state.plot <- ggplot(agg.cases.state[date >= "2020-03-01"], aes(x = date, y = total_new_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Confirmed new COVID cases",
       title = "Confirmed new COVID cases by day",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.new.cases.state.plot

use.state <- "Tennessee"
cases.state <- state.raw[state %in% use.state]
agg.cases.state <- cases.state[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
temp <- agg.cases.state
agg.cases.state[, total_cases_prev := temp$total_cases[match(agg.cases.state$date - 1, temp$date)]]
agg.cases.state[, total_new_cases := total_cases - total_cases_prev]
agg.new.cases.state.plot <- ggplot(agg.cases.state[date >= "2020-03-01"], aes(x = date, y = total_new_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Confirmed new COVID cases",
       title = "Confirmed new COVID cases by day",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.new.cases.state.plot

Our counties

use.state <- "Washington"
use.county <- "Pierce"
cases.county <- county.raw[state %in% use.state & county %in% use.county]
agg.cases.county <- cases.county[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
temp <- agg.cases.county
agg.cases.county[, total_cases_prev := temp$total_cases[match(agg.cases.county$date - 1, temp$date)]]
agg.cases.county[, total_new_cases := total_cases - total_cases_prev]
agg.new.cases.county.plot <- ggplot(agg.cases.county[date >= "2020-03-01"], aes(x = date, y = total_new_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Confirmed new COVID cases",
       title = "Confirmed new COVID cases by day",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.new.cases.county.plot

use.state <- "California"
use.county <- "Orange"
cases.county <- county.raw[state %in% use.state & county %in% use.county]
agg.cases.county <- cases.county[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
temp <- agg.cases.county
agg.cases.county[, total_cases_prev := temp$total_cases[match(agg.cases.county$date - 1, temp$date)]]
agg.cases.county[, total_new_cases := total_cases - total_cases_prev]
agg.new.cases.county.plot <- ggplot(agg.cases.county[date >= "2020-03-01"], aes(x = date, y = total_new_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Confirmed new COVID cases",
       title = "Confirmed new COVID cases by day",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.new.cases.county.plot

use.state <- "South Carolina"
use.county <- "Richland"
cases.county <- county.raw[state %in% use.state & county %in% use.county]
agg.cases.county <- cases.county[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
temp <- agg.cases.county
agg.cases.county[, total_cases_prev := temp$total_cases[match(agg.cases.county$date - 1, temp$date)]]
agg.cases.county[, total_new_cases := total_cases - total_cases_prev]
agg.new.cases.county.plot <- ggplot(agg.cases.county[date >= "2020-03-01"], aes(x = date, y = total_new_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Confirmed new COVID cases",
       title = "Confirmed new COVID cases by day",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.new.cases.county.plot

use.state <- "Tennessee"
use.county <- "Davidson"
cases.county <- county.raw[state %in% use.state & county %in% use.county]
agg.cases.county <- cases.county[order(date),
                          .(total_cases = sum(cases, na.rm = T)),
                          by = "date"]
temp <- agg.cases.county
agg.cases.county[, total_cases_prev := temp$total_cases[match(agg.cases.county$date - 1, temp$date)]]
agg.cases.county[, total_new_cases := total_cases - total_cases_prev]
agg.new.cases.county.plot <- ggplot(agg.cases.county[date >= "2020-03-01"], aes(x = date, y = total_new_cases)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Confirmed new COVID cases",
       title = "Confirmed new COVID cases by day",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.new.cases.county.plot

Total deaths

U.S.

agg.deaths.US <- state.raw[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
agg.deaths.US.plot <- ggplot(agg.deaths.US[date >= "2020-03-01"], aes(x = date, y = total_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total COVID-related deaths",
       title = "Total COVID-related deaths",
       subtitle = "United States") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.deaths.US.plot

Our states

# adjust state name to flow through rest of code (use capitalized full state name)
use.state <- "Washington"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- cases.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
agg.deaths.state.plot <- ggplot(agg.deaths.state[date >= "2020-03-01"], aes(x = date, y = total_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total COVID-related deaths",
       title = "Total COVID-related deaths",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.deaths.state.plot

# adjust state name to flow through rest of code (use capitalized full state name)
use.state <- "California"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- cases.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
agg.deaths.state.plot <- ggplot(agg.deaths.state[date >= "2020-03-01"], aes(x = date, y = total_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total COVID-related deaths",
       title = "Total COVID-related deaths",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.deaths.state.plot

# adjust state name to flow through rest of code (use capitalized full state name)
use.state <- "South Carolina"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- cases.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
agg.deaths.state.plot <- ggplot(agg.deaths.state[date >= "2020-03-01"], aes(x = date, y = total_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total COVID-related deaths",
       title = "Total COVID-related deaths",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.deaths.state.plot

# adjust state name to flow through rest of code (use capitalized full state name)
use.state <- "Tennessee"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- cases.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
agg.deaths.state.plot <- ggplot(agg.deaths.state[date >= "2020-03-01"], aes(x = date, y = total_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total COVID-related deaths",
       title = "Total COVID-related deaths",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.deaths.state.plot

Our counties

# adjust state and county name to flow through rest of code (use capitalized full state name)
use.state <- "Washington"
use.county <- "Pierce"
deaths.county <- county.raw[state %in% use.state & county %in% use.county]
agg.deaths.county <- deaths.county[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
agg.deaths.county.plot <- ggplot(agg.deaths.county[date >= "2020-03-01"], aes(x = date, y = total_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total COVID-related deaths",
       title = "Total COVID-related deaths",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.deaths.county.plot

# adjust state and county name to flow through rest of code (use capitalized full state name)
use.state <- "California"
use.county <- "Orange"
deaths.county <- county.raw[state %in% use.state & county %in% use.county]
agg.deaths.county <- deaths.county[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
agg.deaths.county.plot <- ggplot(agg.deaths.county[date >= "2020-03-01"], aes(x = date, y = total_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total COVID-related deaths",
       title = "Total COVID-related deaths",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.deaths.county.plot

# adjust state and county name to flow through rest of code (use capitalized full state name)
use.state <- "South Carolina"
use.county <- "Richland"
deaths.county <- county.raw[state %in% use.state & county %in% use.county]
agg.deaths.county <- deaths.county[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
agg.deaths.county.plot <- ggplot(agg.deaths.county[date >= "2020-03-01"], aes(x = date, y = total_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total COVID-related deaths",
       title = "Total COVID-related deaths",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.deaths.county.plot

# adjust state and county name to flow through rest of code (use capitalized full state name)
use.state <- "South Carolina"
use.county <- "York"
deaths.county <- county.raw[state %in% use.state & county %in% use.county]
agg.deaths.county <- deaths.county[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
agg.deaths.county.plot <- ggplot(agg.deaths.county[date >= "2020-03-01"], aes(x = date, y = total_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total COVID-related deaths",
       title = "Total COVID-related deaths",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.deaths.county.plot

# adjust state and county name to flow through rest of code (use capitalized full state name)
use.state <- "Tennessee"
use.county <- "Davidson"
deaths.county <- county.raw[state %in% use.state & county %in% use.county]
agg.deaths.county <- deaths.county[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
agg.deaths.county.plot <- ggplot(agg.deaths.county[date >= "2020-03-01"], aes(x = date, y = total_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "Total COVID-related deaths",
       title = "Total COVID-related deaths",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.deaths.county.plot

New deaths

U.S.

agg.deaths.US <- state.raw[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
temp <- agg.deaths.US
agg.deaths.US[, total_deaths_prev := temp$total_deaths[match(agg.deaths.US$date - 1, temp$date)]]
agg.deaths.US[, total_new_deaths := total_deaths - total_deaths_prev]
agg.new.deaths.US.plot <- ggplot(agg.deaths.US[date >= "2020-03-01"], aes(x = date, y = total_new_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "New COVID-related deaths",
       title = "New COVID-related deaths by day",
       subtitle = "United States") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5)) +
  scale_y_continuous(labels = comma)
agg.new.deaths.US.plot

Our states

use.state <- "Washington"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- deaths.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
temp <- agg.deaths.state
agg.deaths.state[, total_deaths_prev := temp$total_deaths[match(agg.deaths.state$date - 1, temp$date)]]
agg.deaths.state[, total_new_deaths := total_deaths - total_deaths_prev]
agg.new.deaths.state.plot <- ggplot(agg.deaths.state[date >= "2020-03-01"], aes(x = date, y = total_new_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "New COVID-related deaths",
       title = "New COVID-related deaths by day",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.new.deaths.state.plot

use.state <- "California"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- deaths.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
temp <- agg.deaths.state
agg.deaths.state[, total_deaths_prev := temp$total_deaths[match(agg.deaths.state$date - 1, temp$date)]]
agg.deaths.state[, total_new_deaths := total_deaths - total_deaths_prev]
agg.new.deaths.state.plot <- ggplot(agg.deaths.state[date >= "2020-03-01"], aes(x = date, y = total_new_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "New COVID-related deaths",
       title = "New COVID-related deaths by day",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.new.deaths.state.plot

use.state <- "South Carolina"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- deaths.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
temp <- agg.deaths.state
agg.deaths.state[, total_deaths_prev := temp$total_deaths[match(agg.deaths.state$date - 1, temp$date)]]
agg.deaths.state[, total_new_deaths := total_deaths - total_deaths_prev]
agg.new.deaths.state.plot <- ggplot(agg.deaths.state[date >= "2020-03-01"], aes(x = date, y = total_new_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "New COVID-related deaths",
       title = "New COVID-related deaths by day",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.new.deaths.state.plot

use.state <- "Tennessee"
deaths.state <- state.raw[state %in% use.state]
agg.deaths.state <- deaths.state[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
temp <- agg.deaths.state
agg.deaths.state[, total_deaths_prev := temp$total_deaths[match(agg.deaths.state$date - 1, temp$date)]]
agg.deaths.state[, total_new_deaths := total_deaths - total_deaths_prev]
agg.new.deaths.state.plot <- ggplot(agg.deaths.state[date >= "2020-03-01"], aes(x = date, y = total_new_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "New COVID-related deaths",
       title = "New COVID-related deaths by day",
       subtitle = use.state) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.new.deaths.state.plot

Our counties

use.state <- "Washington"
use.county <- "Pierce"
deaths.county <- county.raw[state %in% use.state & county %in% use.county]
agg.deaths.county <- deaths.county[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
temp <- agg.deaths.county
agg.deaths.county[, total_deaths_prev := temp$total_deaths[match(agg.deaths.county$date - 1, temp$date)]]
agg.deaths.county[, total_new_deaths := total_deaths - total_deaths_prev]
agg.new.deaths.county.plot <- ggplot(agg.deaths.county[date >= "2020-03-01"], aes(x = date, y = total_new_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "New COVID-related deaths",
       title = "New COVID-related deaths by day",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.new.deaths.county.plot

use.state <- "California"
use.county <- "Orange"
deaths.county <- county.raw[state %in% use.state & county %in% use.county]
agg.deaths.county <- deaths.county[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
temp <- agg.deaths.county
agg.deaths.county[, total_deaths_prev := temp$total_deaths[match(agg.deaths.county$date - 1, temp$date)]]
agg.deaths.county[, total_new_deaths := total_deaths - total_deaths_prev]
agg.new.deaths.county.plot <- ggplot(agg.deaths.county[date >= "2020-03-01"], aes(x = date, y = total_new_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "New COVID-related deaths",
       title = "New COVID-related deaths by day",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.new.deaths.county.plot

use.state <- "South Carolina"
use.county <- "Richland"
deaths.county <- county.raw[state %in% use.state & county %in% use.county]
agg.deaths.county <- deaths.county[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
temp <- agg.deaths.county
agg.deaths.county[, total_deaths_prev := temp$total_deaths[match(agg.deaths.county$date - 1, temp$date)]]
agg.deaths.county[, total_new_deaths := total_deaths - total_deaths_prev]
agg.new.deaths.county.plot <- ggplot(agg.deaths.county[date >= "2020-03-01"], aes(x = date, y = total_new_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "New COVID-related deaths",
       title = "New COVID-related deaths by day",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.new.deaths.county.plot

use.state <- "South Carolina"
use.county <- "York"
deaths.county <- county.raw[state %in% use.state & county %in% use.county]
agg.deaths.county <- deaths.county[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
temp <- agg.deaths.county
agg.deaths.county[, total_deaths_prev := temp$total_deaths[match(agg.deaths.county$date - 1, temp$date)]]
agg.deaths.county[, total_new_deaths := total_deaths - total_deaths_prev]
agg.new.deaths.county.plot <- ggplot(agg.deaths.county[date >= "2020-03-01"], aes(x = date, y = total_new_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "New COVID-related deaths",
       title = "New COVID-related deaths by day",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.new.deaths.county.plot

use.state <- "Tennessee"
use.county <- "Davidson"
deaths.county <- county.raw[state %in% use.state & county %in% use.county]
agg.deaths.county <- deaths.county[order(date),
                          .(total_deaths = sum(deaths, na.rm = T)),
                          by = "date"]
temp <- agg.deaths.county
agg.deaths.county[, total_deaths_prev := temp$total_deaths[match(agg.deaths.county$date - 1, temp$date)]]
agg.deaths.county[, total_new_deaths := total_deaths - total_deaths_prev]
agg.new.deaths.county.plot <- ggplot(agg.deaths.county[date >= "2020-03-01"], aes(x = date, y = total_new_deaths)) + 
  geom_bar(stat = "identity") +
    labs(x = "Date",
       y = "New COVID-related deaths",
       title = "New COVID-related deaths by day",
       subtitle = paste0(use.county, " County, ", use.state)) +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
agg.new.deaths.county.plot

Stay-at-home comparisons

state.dt <- state.raw
state.dt[, stay_date := stay_dates$start_date[match(state.raw$state, stay_dates$state)]]
state.dt[, population := stay_dates$population[match(state.raw$state, stay_dates$state)]]
#state.dt[, flgOrder := ifelse(is.na(stay_date), 0, 1)]
state.dt[, flgOrder := ifelse(is.na(stay_date) | stay_date >= date, "No", "Yes")]
#state.dt[, ctDaysFromBaseline := ifelse(flgOrder == 0, as.integer(date - as.Date("2020-03-10")),
#                                         as.integer(date - stay_date))]
#state.dt[, ctDaysFromBaseline := as.integer(date - stay_date)]
temp <- state.dt
temp <- temp[, c("date", "state", "cases")]
setnames(temp, "cases", "cases_prev3")
state.dt[, dtPrev3 := date - 3]
state.dt <- merge(state.raw, temp, all.x = T, by.x = c("state", "dtPrev3"), by.y = c("state", "date"))
state.dt[, casesNewPerMillion := as.integer((cases - cases_prev3)/population * 1000000)]
state.agg.comp <- state.dt[date >= "2020-03-10" & !state %in% "Puerto Rico"]
state.agg.comp <- state.agg.comp[order(date, flgOrder),
                          .(avgNewCases = mean(casesNewPerMillion, na.rm = T),
                            cts = .N),
                           by = c("date", "flgOrder")]
state.agg.comp.plot <- ggplot(state.agg.comp, aes(x = date, y = avgNewCases, colour = as.factor(flgOrder))) +
  geom_point(aes(size = cts)) +
  geom_line(aes(group = flgOrder)) +
    labs(x = "Date",
       y = "New confirmed COVID cases per million residents",
       title = "New COVID cases vs.stay-at-home order",
       subtitle = "Average of 3-day rolling totals per million residents",
       size = "Count of states",
       colour = "Stay-at-home order") +
  theme(plot.title = element_text(hjust = 0.5),
        plot.subtitle = element_text(hjust = 0.5))
state.agg.comp.plot